package de.e2it3t.schulverwaltung.ui;

import com.jgoodies.forms.layout.CellConstraints;
import com.jgoodies.forms.layout.FormLayout;
import de.e2it3t.schulverwaltung.App;
import de.e2it3t.schulverwaltung.data.CommonTableModel;
import de.e2it3t.schulverwaltung.data.LehrblockTable;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.List;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;

/**
 * Ansicht der Lehrblöcke.
 * 
 * @author Viktor Reiser
 */
public class LehrblockView extends JPanel implements AppView {

    private JTable lehrblockTable;
    private JButton addButton;
    private JButton editButton;
    private JButton deleteButton;
    
    private List<LehrblockTable> lehrblockData;
    
    
    public LehrblockView() {
        super();
        
        setupLehrblockTable();
        setupAddButton();
        setupDeleteButton();
        setupEditButton();
        
        setLayout(new FormLayout(
                "fill:pref:grow, pref, 5px, pref, 5px, pref, 5px, pref",
                "pref, 5px, fill:pref:grow"));
        CellConstraints cc = new CellConstraints();
        
        add(addButton, cc.xy(2, 1));
        add(editButton, cc.xy(4, 1));
        add(deleteButton, cc.xy(6, 1));
        add(App.createInfoButton("<html>Die Lehrblockansicht listet die Lehrblöcke aller Klassen. "
                + "Man kann Lehrblöcke hinzufügen, bearbeiten oder löschen.<br><br>"
                + "Ein Lehrblock ist immer einer Kalenderwoche eines bestimmten Jahres zugeordnet "
                + "und besagt somit, dass die betroffene Klasse ihre zusammengestellten "
                + "Lehreinheiten (Stundenplan) in dieser Woche erhält.", 400, 140), cc.xy(8, 1));
        add(new JScrollPane(lehrblockTable), cc.xywh(1, 3, 8, 1));
    }
    
    
    private void setupLehrblockTable() {
        lehrblockTable = new JTable();
        // Liste soll den kompletten, zur Verfügung stehenden Platz nutzen
        lehrblockTable.setFillsViewportHeight(true);
        // Hack: wir brauchen eine gewünschte Größe, damit die Liste
        // gescrollt werden kann, wenn sie zu viele Einträge hat
        lehrblockTable.setPreferredScrollableViewportSize(new Dimension(50, 50));
        // wir wollen die Liste durch Klick auf die Header sortieren können
        lehrblockTable.setAutoCreateRowSorter(true);
        lehrblockTable.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                // Buttons ensprechend der Selektion de-/aktivieren
                deleteButton.setEnabled(
                        lehrblockTable.getSelectedRowCount() != 0);
                editButton.setEnabled(
                        lehrblockTable.getSelectedRowCount() == 1);
                
                // Doppelklick
                if (e.getClickCount() == 2) {
                    editSelectedLehrblock();
                }
            }
        });
    }
    
    private void setupAddButton() {
        addButton = new JButton("Hinzufügen");
        addButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                new LehrblockDialog(LehrblockView.this).setVisible(true);
            }
        });
    }
    
    private void setupEditButton() {
        editButton = new JButton("Editieren");
        editButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent ae) {
                editSelectedLehrblock();
            }
        });
    }
    
    private void setupDeleteButton() {
        deleteButton = new JButton("Löschen");
        deleteButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent ae) {
                deleteSelectedLehrblock();
            }
        });
    }
    
    
    private void editSelectedLehrblock() {
         if (lehrblockTable.getSelectedRowCount() != 1) {
            return;
        }
        
        int lehrblockId = lehrblockData.get(
                lehrblockTable.convertRowIndexToModel(
                lehrblockTable.getSelectedRow())).getId();

        new LehrblockDialog(this, lehrblockId).setVisible(true);
    }
    
    private void deleteSelectedLehrblock() {
        if (lehrblockTable.getSelectedRowCount() == 0) {
            return;
        }
        
        int lehrblockCount = lehrblockTable.getSelectedRowCount();
        int result = JOptionPane.showConfirmDialog(
                null,
                "Wollen sie wirklich "
                + (lehrblockCount == 1 ? "den gewählten Lehrblock" : lehrblockCount + " Lehrblöcke")
                + " löschen?",
                "Lehrblock löschen?",
                JOptionPane.YES_NO_OPTION, 
                JOptionPane.QUESTION_MESSAGE);

        if (result == JOptionPane.YES_OPTION) {
            for (int index : lehrblockTable.getSelectedRows()) {
                App.getDatabase().deleteLehrblock(lehrblockData.get(
                        lehrblockTable.convertRowIndexToModel(index)).getId());
            }
            
            refreshView();
        }
    }
    
    
    @Override
    public void refreshView() {
        editButton.setEnabled(false);
        deleteButton.setEnabled(false);
        
        lehrblockData = App.getDatabase().getLehrblockTable();
        
        for (LehrblockTable lb : lehrblockData) {
            lb.buildKalenderwocheString();
        }
        
        lehrblockTable.setModel(new CommonTableModel(
                lehrblockData,
                new String[] {"klasse", "jahr", "kalenderwocheString"},
                new String[] {"Klasse", "Jahr", "Zeitraum"}));
        lehrblockTable.getRowSorter().toggleSortOrder(1);
        lehrblockTable.getRowSorter().toggleSortOrder(1);
        
        boolean hasKlassen = App.getDatabase().hasKlassen();
        
        addButton.setEnabled(hasKlassen);
        addButton.setToolTipText(hasKlassen ? null : "Keine Klassen vorhanden");
    }

    @Override
    public JComponent getView() {
        return this;
    }

    @Override
    public String getViewName() {
        return "Lehrblöcke";
    }
}
